package com.jiwei.community.config;

import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.serializer.ToStringSerializer;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

/**
 * @Author 季伟
 * 功能：
 */
@Configuration
@ConfigurationProperties(prefix = "upload")
public class WebConfig implements WebMvcConfigurer {
    @Value("${upload.path}")
    String fileLocation ;
    /**
     * 解决跨域问题，但这种方式不能完全解决。当用此方式时同时也进行了自定义拦截器的配置时这种方式会失效，
     * 因为浏览器在请求时会先经过拦截器而不经过此方法，所以返回的头信息中就没有了跨域的信息
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        //进行跨域设置的域名
        registry.addMapping("/**")
                //允许进行跨域的域名
                .allowedOrigins("*")
                //允许cookie
                .allowCredentials(true)
                //允许的请求方式
                .allowedMethods("GET","POST","DELETE","PUT")
                //允许所有的头信息
                .allowedHeaders("*")
                .maxAge(3600);
    }

    /**
     * 配置一个json序列化的转换器
     * @return 消息转向器的实例,可以用于controller返回数据时将类对象按照转换器配置的序列化规则转化为json数据
     */
    @Bean()
    public HttpMessageConverter<?> fastJsonHttpMessageConverters(){
        FastJsonHttpMessageConverter fastJsonConvert = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        //修改配置返回内容的过滤
        //WriteNullListAsEmpty  ：List字段如果为null,输出为[],而非null
        //WriteNullStringAsEmpty ： 字符类型字段如果为null,输出为"",而非null
        //DisableCircularReferenceDetect ：消除对同一对象循环引用的问题，默认为false（如果不配置有可能会进入死循环）
        //WriteNullBooleanAsFalse：Boolean字段如果为null,输出为false,而非null
        //WriteMapNullValue：是否输出值为null的字段,默认为false
        //PrettyFormat设置序列化后的json是格式化的json也就是最规范化的写法比如每一个属性之后都有换行，这种序列化结果易于查看
        fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
        fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteMapNullValue);
        //设置将日期类型的属性转换为json时对应的格式
        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
        //将返回数据中Long类型数据变换为String类型
//        SerializeConfig.globalInstance.put(Long.class, ToStringSerializer.instance);
        fastJsonConfig.setSerializeConfig(SerializeConfig.globalInstance);

        fastJsonConvert.setFastJsonConfig(fastJsonConfig);
        return fastJsonConvert;
    }

    /**
     * 配置消息转换器用来设置请求相应对象的json转换格式
     * @param converters
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

        converters.add(fastJsonHttpMessageConverters());
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        System.out.println(fileLocation);
        registry.addResourceHandler("/file/**")
                .addResourceLocations("file:"+fileLocation);
    }
}
